package org.locker.netty.dto.resp;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Getter;
import lombok.Setter;
import org.locker.domain.dto.GridFeesConfig;
import org.locker.domain.enums.PositionTypeEnum;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * @author: winnie
 * @create: 2023-10-08
 * @Description: 绑定数据
 */
@Getter
@Setter
public class BindResp {

    private String host;

    private Integer port;

    private boolean bingSuccess;

    private String msg;

    /**
     * 公共信息
     */
    private CommonDto commonInfo;

    /**
     * 场地ID
     */
    private Long positionId;

    private PositionDto positionInfo;

    /************上面是场地信息****************/

    /**
     * 设备ID
     */
    private Long deviceId;

    /**
     * 设备编号
     */
    private String deviceNo;
    /**
     * 设备编号
     */
    private String deviceQrCode;
    private Integer isShowMp;
    private String deviceMpQrCode;
    /**
     * 设备密码
     */
    private String devicePwd;


    /**
     * 设备名称
     */
    private String name;

    /**
     * 设备描述
     */
    @TableField(value = "`describe`")
    private String describe;

    /**
     * 设备位置
     */
    private String deviceLocation;

    /**
     * 设备状态：online 上线,offline 离线 , discard 废弃
     */
    private String status;

    /**
     * 建立时间
     */
    private Long connectTime;

    /**
     * 进入设备后台账号
     */
    private String adminUser;

    /**
     * 进入设备后台的密码。
     */
    private String adminPwd;


    /**
     * 格子总数量
     */
    private Long gardNum;

    /**
     * Imli
     */
    private String deviceImei;

    /**
     * 设备卡号
     */
    private String deviceCardNo;

    /**
     * 设备通讯卡号ICCID
     */
    private String deviceIccid;

    /**
     * 设备类型： serial 串口锁，bluetooth 蓝牙锁
     */
    private String deviceType;
    /**
     * 押金金额
     */
    private BigDecimal depositAmount;


    /**
     * 收费类型：free 免费  hour 小时, times 按次，special 特殊方式
     */
    private String feeType;

    /**
     * 收费配置:{json}
     */
    private String feeConfig;


    /************上面是设备信息****************/


    /**
     * 锁柜信息
     */
    private List<DeviceGridDto> deviceGrids;


    /**
     * 场地信息
     */
    @Getter
    @Setter
    public static class PositionDto {

        private Long positionId;

        /**
         * 负责人
         */
        private String username;

        /**
         * 负责人电话
         */
        private String phone;

        /**
         * 营业时间
         */
        private String workTime;


        /**
         * 场地名称
         */
        private String name;

        /**
         * 场地描述
         */
        private String describe;

        /**
         * 场地地址
         */
        private String location;

        /**
         * 经度
         */
        private BigDecimal longitude;

        /**
         * 纬度
         */
        private BigDecimal latitude;

        /**
         * 场地二维码地址
         */
        private String qrCode;

        /**
         * 设备状态：online 营业,wait 待营业 , discard 已废弃
         */
        private String status;

        /**
         * 押金金额
         */
        private BigDecimal depositAmount;

        /**
         * 场地类型：free 免费  hour 小时, times 按次，special 特殊方式
         */
        private String positionType;

        /**
         * 场地收费配置:{json}
         */
        private String positionConfig;


        /**
         * 计费标题
         */
        private String configTitle;

        /**
         * 计费规则
         */
        private String configFeesTitle;

        /**
         * 计费详细规则
         */
        private List<String> configFeesDestTitle;


        /**
         * 备注
         */
        private String remark;


        /**
         * 设置计费规则
         *
         * @param free_minutes
         * @param customerPhone
         */
        public void setFeesText(int free_minutes, String customerPhone) {
            List<String> descTitles = new ArrayList<>();
            String positionConfig = this.getPositionConfig();
            String positionType = this.getPositionType();
            List<GridFeesConfig> gridFees = JSONUtil.toList(positionConfig, GridFeesConfig.class);
            if (PositionTypeEnum.hour.name().equals(positionType)) {
                configTitle = "小时收费";
                BigDecimal minPrice = gridFees.stream().map(GridFeesConfig::getHourPrice).min(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
                BigDecimal maxPrice = gridFees.stream().map(GridFeesConfig::getMaxHourPrice).max(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
                configFeesTitle = "每小时" + minPrice + "元，封顶" + maxPrice + "元";
                descTitles.add("寄存在" + free_minutes + "分钟内免费，超过时间按最低每小时" + minPrice + "元计费");
                descTitles.add("押金为" + depositAmount + "元，寄存结束后即可退回");
                descTitles.add("当日务必将所有物品取出");
                descTitles.add("如遇任何问题请拨打上方24h免费热线电话:" + customerPhone);
                descTitles.add("本柜支持存手机，取手机点击下方[取包]按钮。");

            } else if (PositionTypeEnum.times.name().equals(positionType)) {
                BigDecimal timesPrice = gridFees.stream().map(GridFeesConfig::getTimesPrice).min(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
                configTitle = "按次收费";
                configFeesTitle = "每次" + timesPrice + "元";
                descTitles.add("寄存在" + free_minutes + "分钟内免费,押金为" + depositAmount + "元，寄存结束后即可退回");
                descTitles.add("当日务必将所有物品取出");
                descTitles.add("如遇任何问题请拨打上方24h免费热线电话:" + customerPhone);
                descTitles.add("本柜支持存手机，取手机点击下方[取包]按钮。");

            } else if (PositionTypeEnum.special.name().equals(positionType)) {

            } else if (PositionTypeEnum.free.name().equals(positionType)) {
                BigDecimal timesPrice = gridFees.stream().map(GridFeesConfig::getTimesPrice).min(BigDecimal::compareTo).orElse(BigDecimal.ZERO);
                configTitle = "免费寄存";
                configFeesTitle = "";
                descTitles.add("免费寄存");
                descTitles.add("当日务必将所有物品取出");
                descTitles.add("如遇任何问题请拨打上方24h免费热线电话:" + customerPhone);
                descTitles.add("本柜支持存手机，取手机点击下方[取包]按钮。");
            }

            this.configFeesDestTitle = descTitles;
        }


    }

    /**
     * 锁柜信息
     */
    @Getter
    @Setter
    public static class DeviceGridDto {


        /**
         * 格子ID
         */
        private Long deviceGridId;

        /**
         * 名称
         */
        private String name;

        /**
         * 编号
         */
        private String number;

        /**
         * 串口编号
         */
        private String serialNo;

        /**
         * 串口索引
         */
        private String serialIndex;


        /**
         * 蓝牙地址
         */
        private String macNo;


        /**
         * 类型：common 常规,screen 屏幕使用,special 特殊用途
         */
        private String gridType;

        /**
         * 格子状态：locker 已占用,unlock 未使用
         */
        private String status;


        /**
         * 当前锁绑定的订单号(有就返回,没有就不出来)
         */
        private String orderNo;


        /**
         * 备注
         */
        private String remark;


        /****************以上是格子集成信息****************/

        /**
         * 格子规格：small, common,large
         */
        private String specCode;

        /**
         * 存放价格
         */
        private BigDecimal specPrice;


    }


    /**
     * 公共信息
     */
    @Getter
    @Setter
    public static class CommonDto {

        /**
         * 品牌名称
         */
        private String brandName;

        /**
         * 英文名
         */
        private String englishName;

        /**
         * 客服电话
         */
        private String servicePhone;

        /**
         * 营业时间
         */
        private String serviceTime;


    }

}
